package Java0310;

import java.util.Scanner;

public class GoldbachConjecture {
    public static void main(String[] args) {
        //一个大于6的偶数可以分解为两个质数和
        //要求输入一个大于6的偶数，不满足重新输入；然后分解成两个质数和 类似 12=5+7
        //思路：首先把2-number的所有质数找出来，存放到array[]数组中（从小到大排列），第二、利用数组中首尾质数相加，如果首尾相加=number则找到了；
        //如果大于number则指向尾部的常量-1，相加继续判断是否相等；如果小于number则指向头部的常量+1，相加继续判断是否相等；直到找到结果
        //程序有漏洞，找到一种满足的情况即退出，没有输出所有的结果。例如，1000=3+997和17+983
        //质数从2开始
        int k = 2;
        //数组下标
        int index = 0;
        int number;
        //2-number质数的个数
        int count = 0;
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个数字：");
        while (true) {
            number = scan.nextInt();
            if (number > 6 && number % 2 == 0) {
                break;
            }
            System.out.println("请重新输入：");
        }
        //定义一个数组存放2到number的所有质数
        int[] array = new int[number - 2];
        //找出2-number的所有质数，存放到array[]数组中
        for (int i = 2; i <= number; i++) {
            //内层循环判断质数
            for (k = 2; k * k < i && i % k != 0; k++) {

            }
            if (k * k > i) {
                //质数个数加1
                count++;
                //找到的质数放到数组中
                array[index] = i;
                index++;
            }
        }
        //输出数组，查看一下
        for (int i = 0; i < count; i++) {
            System.out.print(array[i] + " ");
        }
        //开始从质数数组中查找两个相加==目标数字的两个质数
        int left = 0;
        int right = count - 1;
        //标记有没有找到
        boolean flag = false;
        while (left < right) {
            if (array[left] + array[right] == number) {
                System.out.println("\n找到了两个质数相加等于目标偶数：" + array[left] + "+" + array[right] + "=" + number);
                flag = true;
                break;
            } else if (array[left] + array[right] > number) {
                right -= 1;
            } else {
                left += 1;
            }
        }
        //没有找到
        if (!flag) {
            System.out.println("猜想错误！");
        }
    }
}

